home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 23 code / Documentary Synchronicity ƒ / Source ƒ / Support ƒ / Toolbox.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-06  |  4.6 KB  |  185 lines  |  [TEXT/KAHL]

  1. /* 4567890123456789012345678901234567890123456789012345678901234567 */
  2. /*
  3.  * File:              Toolbox.c
  4.  * Author:            Mark H. Linton
  5.  * Creation Date:     2/4/95
  6.  * Modification Date: 
  7.  * Description:       A collection of routines which may be used to 
  8.  *                    handle tasks that every application performs
  9.  *                    in exactly the same way. 
  10.  */
  11. #include <Dialogs.h>
  12. #include <Fonts.h>
  13. #include <DiskInit.h>
  14. #include <ToolUtils.h>
  15. #include <Resources.h>
  16. #include <Memory.h>
  17. #include <LowMem.h>
  18. #include <Gestalt.h>
  19.  
  20. #include "Toolbox.h"
  21. #include "ResourceDefinitions.h"
  22.  
  23. #define kReserveMemorySize (48L * 1024L)
  24. #define kMinStackSpace (32L * 1024L)
  25. /* 
  26.  * With a heap of 136K and a 48K reserve, DocumentarySynchronicity
  27.  * triggers its GrowZoneProc when 29 empty windows are open. At this
  28.  * point the MacsBug 'HT' command indicates that there are 876
  29.  * relocatable (Handle based) objects in the heap. We allow about 25%
  30.  * more than required in kTotalMasterPointers. This is divided by 64
  31.  * in InitToolbox to determine the number of master pointer blocks
  32.  * required by the application.
  33.  */
  34. #define kTotalMasterPointers ((876 * 5) / 4)
  35.  
  36. pascal long ShellGrowZone(Size aBytesNeeded);
  37.  
  38. struct Toolbox {
  39.     Handle reserveMemory;
  40.     Boolean notified;
  41. } t; /* do not clutter global name space, Re: qd.thePort */
  42.  
  43. OSErr InitToolbox(void) {
  44.     OSErr theError = noErr;
  45.     long theDefaultStack = LMGetDefltStack();
  46.     short i;
  47.     Ptr theApplLimit = GetApplLimit();
  48.  
  49.     t.notified = false;
  50.     t.reserveMemory = nil;
  51.     if (theDefaultStack < kMinStackSpace) {
  52.         SetApplLimit(theApplLimit - (kMinStackSpace - theDefaultStack));
  53.         theError = MemError(); /* memFullErr (-108) - no stack space */
  54.     } else {
  55.         theError = noErr;
  56.     }
  57.     if (theError == noErr) {
  58.         MaxApplZone();
  59.         for (i=0; (i<(kTotalMasterPointers/64)) && (theError == noErr); i++) {
  60.             MoreMasters();
  61.             theError = MemError(); /* memFullErr (-108) means no space 
  62.                                       for master pointer blocks */
  63.         }
  64.     }
  65.     if (theError == noErr) {
  66.         t.reserveMemory = NewHandleClear(kReserveMemorySize);
  67.         if (t.reserveMemory == nil) {
  68.             theError = memFullErr; /* did not have space for reserve 
  69.                                       memory */
  70.         } else {
  71.             MoveHHi(t.reserveMemory);
  72.             HLock(t.reserveMemory);
  73.             SetGrowZone(ShellGrowZone);
  74.         }
  75.     }
  76.  
  77.     /* Need these to work even if just to display our error dialog */
  78.     InitGraf((Ptr)&qd.thePort);
  79.     InitFonts();
  80.     InitWindows();
  81.     InitMenus();
  82.     FlushEvents(everyEvent,0);
  83.     TEInit();
  84.     InitDialogs(0L);
  85.     
  86.     return theError;
  87. }
  88.  
  89. pascal long ShellGrowZone(Size aBytesNeeded) {
  90.     long theA5;
  91.     long theBytesFreed = 0;
  92.     
  93.     theA5 = SetCurrentA5();
  94.     if ((t.reserveMemory != nil) && (*(t.reserveMemory) != nil) && 
  95.             (t.reserveMemory != GZSaveHnd())) {
  96.         HUnlock(t.reserveMemory);
  97.         EmptyHandle(t.reserveMemory);
  98.         theBytesFreed = kReserveMemorySize;
  99.     }
  100.     theA5 = SetA5(theA5);
  101.     return theBytesFreed;
  102. }
  103.  
  104. void CheckGrowZone(void) {
  105.     if ((t.reserveMemory != nil) && (*(t.reserveMemory) == nil)) {
  106.         /*
  107.          * Reserve was released, try to get it back.
  108.          */
  109.         ReallocateHandle(t.reserveMemory, kReserveMemorySize); 
  110.         if (MemError() == memFullErr) {
  111.             if (!t.notified) {
  112.                 (void)StopAlert(rLowMemoryAlert, nil);
  113.                 t.notified = true;
  114.             }
  115.         } else {
  116.             MoveHHi(t.reserveMemory);
  117.             HLock(t.reserveMemory);
  118.             t.notified = false;
  119.         }
  120.     }
  121. }
  122.  
  123. void DoDiskEvent(long aMessage) {
  124.     Point thePoint = {120, 120};
  125.  
  126.     if (HiWord(aMessage) != noErr) {
  127.         DILoad();
  128.         (void)DIBadMount(thePoint, aMessage);
  129.         DIUnload();
  130.     }
  131. }
  132.  
  133. Boolean CommandKeyIsDown(void) {
  134.     KeyMap keymap;
  135.     
  136.     GetKeys(keymap);
  137.     return ((keymap[1] >> 15) & 1);
  138. }
  139.  
  140. Boolean OptionKeyIsDown(void) {
  141.     KeyMap keymap;
  142.     
  143.     GetKeys(keymap);
  144.     return ((keymap[1] >> 2) & 1);
  145. }
  146.  
  147. #ifndef kPMProcessMenuID
  148. #define kPMProcessMenuID (-16489L)
  149. #endif
  150.  
  151. void HideApplication(void) {
  152.     SystemMenu((kPMProcessMenuID << 16) + 1);
  153. }
  154.  
  155. void ReportError(OSErr anError) {
  156.     StringHandle theString = nil;
  157.     Str15 theNumber;
  158.     short theID;
  159.     ResType theType;
  160.     Str255 theName;
  161.     
  162.     NumToString(anError, theNumber);
  163.     theString = (StringHandle)GetResource('Estr', (short)anError);
  164.     if (theString != nil) {
  165.         HLock((Handle)theString);
  166.         GetResInfo((Handle)theString, &theID, &theType, theName);
  167.         ParamText(theNumber, theName, *theString, kNullString);
  168.     } else {
  169.         ParamText(theNumber, "\p???", kNullString, kNullString);
  170.     }
  171.     (void)StopAlert(rErrorAlert, nil);
  172.     if (theString != nil) {
  173.         HUnlock((Handle)theString);
  174.         ReleaseResource((Handle)theString);
  175.     }
  176. }
  177.  
  178. Boolean HasFeature(OSType anAttribute, long aFeature) {
  179.     long theResponse;
  180.     Boolean hasFeature = 
  181.         (Gestalt(anAttribute, &theResponse) == noErr) && 
  182.         ((theResponse & (1L << aFeature)) != 0);
  183.     return hasFeature;
  184. }
  185.